///*
// * PostPostPool.h
// *
// *  Created on: 2014. 6. 17.
// *      Author: jjaehuny
// */
//
//#ifndef FRAMEWORK_NMEMORY_POSTPOOL_H_
//#define FRAMEWORK_NMEMORY_POSTPOOL_H_
//
//#include <memory>
//#include <mutex>
//#include <deque>
//
//#include <glog/logging.h>
//
//#include "../Type.h"
//#include "../Macro.h"
//
//#include "Policy.h"
//
//namespace Framework { namespace NMemory {
//
//template <	class Type,
//			ULONG max_size = 1,
//			ULONG waring_alloc_count = 1000,
//			class Synchronization = Policy::Synchronization::SingleThread,
//			class Factory = Policy::Factory::Doing<Type>,
//			class InitAction = Policy::InitAction::Doing<Type> >
//class PostPool
//{
//public:
//	PostPool()
//	: max_size_(max_size), new_alloc_count(0), warning_new_alloc_count(waring_alloc_count)
//	{
//		type_deque_.clear();
//	}
//	~PostPool()
//	{
//		for (auto * pType : type_deque_)
//		{
//			delete pType;
//		}
//		type_deque_.clear();
//	}
//
//private:
//	PostPool(const PostPool& other) = delete;
//	PostPool& operator=(const PostPool& other) = delete;
//
//public:
//	std::shared_ptr<Type> NEW()
//	{
//		Type * pType = NULL;
//		{
//			std::lock_guard<Synchronization> lock(lock_);
//			if (true == type_deque_.empty())
//			{
//				pType = factory_.NEW();
//			}
//			else
//			{
//				pType = type_deque_.front();
//				type_deque_.pop_front();
//			}
//		}
//
//		if (NULL != pType) initAction.Initialize(pType);
//
//		return std::shared_ptr<Type>(pType, [this](Type * pType) {
//			if (NULL != pType)
//			{
//				std::lock_guard<Synchronization> lock(lock_);
//				initAction.Finalize(pType);
//				type_deque_.push_back(pType);
//			}
//		} );
//	}
//
//	void Post(Type * pType)
//	{
//		if (NULL != pType)
//		{
//			initAction.Initialize(pType);
//			type_deque_.push_back(pType);
//		}
//	}
//
//private:
//	ULONG	max_size_ = 0;
//	ULONG new_alloc_count = 1000;
//	ULONG warning_new_alloc_count = 0;
//
//	std::deque<Type *> type_deque_;
//
//	Synchronization lock_;
//	Factory factory_;
//	InitAction initAction;
//};
//
//} /*NMemory*/ } /*Framework*/
//
//#endif /* FRAMEWORK_NMEMORY_POSTPOOL_H_ */
